package cn.tx.controller;

import cn.hutool.core.util.StrUtil;
import cn.hutool.json.JSONUtil;
import cn.tx.dubbo.client.UserInfoService;
import cn.tx.result.Result;
import cn.tx.result.ResultUtil;
import cn.tx.service.impl.annotation.Log;
import cn.tx.service.impl.annotation.enums.BusinessType;
import cn.tx.service.impl.idempotent.AutoIdempotent;
import cn.tx.service.impl.idempotent.TokenService;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.annotation.Resource;

/**
 * @author: 可乐加糖
 * @create: 2023-03-16 15:16
 * Spring Boot + Redis 解决重复提交问题，一定用的到
 * https://mp.weixin.qq.com/s/1D-8TUtJq74mrDqlBgDgEw
 * @Description: 首先我们需要通过/get/token路径通过getToken()方法去获取具体的token，
 * 然后我们调用testIdempotence方法，这个方法上面注解了@AutoIdempotent，拦截器会拦截所有的请求，
 * 当判断到处理的方法上面有该注解的时候，就会调用TokenService中的checkToken()方法，
 * 如果捕获到异常会将异常抛出调用者，下面我们来模拟请求一下：
 */

@RestController
public class BusinessController {


    @Resource
    private TokenService tokenService;

    @Resource
    private UserInfoService testService;


    @PostMapping("/get/token")
    public String  getToken(){
        String token = tokenService.createToken();
        if (StrUtil.isNotEmpty(token)) {
            Result resultVo = ResultUtil.custom(101, "结果成功").buildData(token);

            return JSONUtil.toJsonStr(resultVo);
        }
        return StrUtil.EMPTY;
    }


    @AutoIdempotent
    @Log(title = "测试日志拦截注解", businessType = BusinessType.UPDATE)
    @PostMapping("/test/idempotence")
    public String testIdempotence() {
        String businessResult = testService.testService();
        if (StrUtil.isNotEmpty(businessResult)) {
            Result resultVo = ResultUtil.custom(101, "结果成功");

            return JSONUtil.toJsonStr(resultVo);
        }
        return StrUtil.EMPTY;
    }
}